/*
 * Copyright (C) 2013 Félix Marín Ramírez | felixmurcia@gmail.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/*
 * DOCUMENTACION: http://documentacion-emple-depart.tk
 */
package adgui.vista;

import adgui.controlador.ControlBajaDep;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *
 * @author Félix Marín Ramírez | felixmurcia@gmail.com
 * @version 1.0
 */
public class BajaDep extends JPanel {

    private ControlBajaDep cBajaDepart;
    private ConsultarDepart vConsultarDepart;
    //---//
    private JPanel panelB, panelC;
    //ETIQUETAS
    private JLabel lbEncabezado, lbNumDep, lbNombre, lbLocalidad;
    //FIN ETIQUETAS
    //CAPOS DE TEXTO
    private JTextField tfNumDep, tfNombre, tfLocalidad, tfMensaje;
    //FIN CAPOS DE TEXTO
    //BOTONES
    private JButton btnConsulta, btnBaja;
    //FIN BOTONES
    //LAYOUT
    private GridBagLayout gbl;
    private GridBagConstraints gbc;

    /**
     * Constructor de la clase encargado de inicializar todos los elementos del
     * JPanel.
     */
    public BajaDep() {
        this.panelB = new JPanel();
        panelB.setLayout(new BorderLayout());
        this.panelC = new JPanel();
        panelC.setLayout(new BorderLayout());
        this.gbl = new GridBagLayout();
        this.gbc = new GridBagConstraints();
        this.gbc.insets = new Insets(3, 3, 3, 3);
        this.gbl.setConstraints(this, gbc);
        this.setLayout(gbl);
        this.vConsultarDepart = new ConsultarDepart();
        try {
            cBajaDepart = new ControlBajaDep(this);
        } catch (SQLException | ClassNotFoundException ex) {
            this.mensajeError(ex.getMessage());
        }

        this.crearPrimeraLinea();
        this.crearSegundaLinea();
        this.crearTerceraLinea();
        this.crearCuartaLinea();
        this.crearQuintaLinea();
        this.setListeners();

        this.setVisible(true);
        panelB.add(this, BorderLayout.LINE_START);
        panelC.add(panelB, BorderLayout.NORTH);
        
        btnBaja.setEnabled(false);
    }

    /**
     *
     * @return Devuelve el panel con todos los elementos insertados y con sus
     * debidos layouts implementados.
     */
    public JPanel getJPanel() {
        return panelC;
    }

    /**
     *
     * @return Devuelve el campo de texto número de departamento.
     */
    public JTextField getCampoNumDep() {
        return tfNumDep;
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoNumDep(String texto) {
        tfNumDep.setText(texto);
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoNombre(String texto) {
        tfNombre.setText(texto);
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoLoc(String texto) {
        tfLocalidad.setText(texto);
    }

    /**
     *
     * @param texto Establece el contenido del campo de texto.
     */
    public void cambiarTextoCampoMensaje(String texto) {
        tfMensaje.setText(texto);
    }

    /**
     * Método encargado de mostrar los errores producidos durante la ejecución
     * de la aplicación.
     *
     * @param mensaje Texto que será mostrado cuando se lance esta ventana.
     */
    public void mensajeError(String mensaje) {
        JOptionPane.showMessageDialog(null, mensaje, "Error", JOptionPane.ERROR_MESSAGE);
    }

    /**
     * Método encargado de crear la primera línea del JPanel.
     */
    private void crearPrimeraLinea() {

        this.setRestricciones(0, 1, 2, 1, 1);
        lbEncabezado = new JLabel("Baja Departamento");
        lbEncabezado.setFont(new Font("sans", Font.BOLD, 20));
        this.add(lbEncabezado, gbc);
    }

    /**
     * Método encargado de crear la segunda línea del JPanel.
     */
    private void crearSegundaLinea() {

        this.setRestricciones(0, 3, 1, 20, 15);
        lbNumDep = new JLabel("Nº Departamento");
        this.add(lbNumDep, gbc);

        this.setRestricciones(1, 3, 2, 150, 15);
        tfNumDep = new JTextField();
        this.add(tfNumDep, gbc);

        this.setRestricciones(4, 3, 1, 20, 15);
        btnConsulta = new JButton("Consulta");
        btnConsulta.setMnemonic(KeyEvent.VK_C);
        btnConsulta.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(!tfNumDep.getText().equals("")) {
                    btnBaja.setEnabled(true);
                }
                try {
                    cBajaDepart.consultar();
                } catch (ClassNotFoundException ex) {
                    mensajeError(ex.getMessage());
                }
            }
        });
        this.add(btnConsulta, gbc);
    }

    /**
     * Método encargado de crear la tercera línea del JPanel.
     */
    private void crearTerceraLinea() {

        this.setRestricciones(0, 4, 1, 20, 15);
        lbNombre = new JLabel("Nombre");
        this.add(lbNombre, gbc);

        this.setRestricciones(1, 4, 2, 150, 15);
        tfNombre = new JTextField();
        tfNombre.setEditable(false);
        this.add(tfNombre, gbc);
    }

    /**
     * Método encargado de crear la primera línea del JPanel.
     */
    private void crearCuartaLinea() {

        this.setRestricciones(0, 5, 1, 20, 15);
        lbLocalidad = new JLabel("Localidad");
        this.add(lbLocalidad, gbc);

        this.setRestricciones(1, 5, 2, 150, 15);
        tfLocalidad = new JTextField();
        tfLocalidad.setEditable(false);
        this.add(tfLocalidad, gbc);
    }

    /**
     * Método encargado de crear la quinta línea del JPanel.
     */
    private void crearQuintaLinea() {

        this.setRestricciones(0, 6, 3, 20, 15);
        tfMensaje = new JTextField();
        tfMensaje.setEditable(false);
        this.add(tfMensaje, gbc);
        this.setRestricciones(4, 6, 1, 20, 15);
        btnBaja = new JButton("Baja");
        btnBaja.setMnemonic(KeyEvent.VK_B);
        this.add(btnBaja, gbc);
        //---//
        this.setRestricciones(0, 7, 1, 20, 15);
        this.add(espacio(), gbc);
    }

    /**
     * Método encargado de establecer los listener de los elementos que los
     * necesiten.
     */
    public void setListeners() {
        btnBaja.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (tfNombre.getText().equals("")) {
                    btnBaja.setEnabled(false);
                } else {
                    try {
                        cBajaDepart.darDeBaja();
                        cBajaDepart.recargar();
                        cBajaDepart.eliminarItemsDelCombo(vConsultarDepart.getCbDepart());
                        vConsultarDepart.getControlConsDepart().setComboDepart();
                    } catch (ClassNotFoundException ex) {
                        mensajeError(ex.getMessage());
                    }
                }
            }
        });
    }

    /**
     * Método utilizado apara añadir un espacio horizontal en el JPanel.
     *
     * @return Devuelve un JLabel.
     */
    private JLabel espacio() {
        JLabel esp = new JLabel();
        esp.setPreferredSize(size(4, 15));
        return esp;
    }

    private Dimension size(int fraccion, int alto) {
        Dimension d = new Dimension(this.getWidth() / fraccion, alto);
        return d;
    }

    /**
     * Método encargado de establecer los parámetros de las varables que
     * establecerán las posiciones de los elementos en el JPanel.
     *
     * @param gridx Posicione X con respecto a la esquna superior izquierda del
     * JPanel.
     * @param gridy Posicione Y con respecto a la esquna superior izquierda del
     * JPanel.
     * @param gridwidth Número de columnas que ocupará el elemento dentro del
     * GridBagLayout del JPanel.
     */
    private void setRestricciones(int gridx, int gridy, int gridwidth, int ipadx, int ipady) {
        gbc.gridx = gridx;
        gbc.gridy = gridy;
        gbc.gridheight = 1;
        gbc.gridwidth = gridwidth;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.ipadx = ipadx;
        gbc.ipady = ipady;
    }
}
